其他
我为什么反对把 Enter 作为发送快捷键
上个月有同事在群里问如何获取一个转瞬即逝的进程的全路径,显然查 /proc/$pid/cmdline 的话怕是手速不够快,由于迄至 5.x 版本的 Linux 内核API 已经足够丰富,以至于已经天然支持了获取全路径的 API,即 get_cmdline 。
我快速在我自己的虚拟机里进行尝试:
#!/usr/bin/stap -g
%{
#include <linux/skbuff.h>
#include <linux/tcp.h>
#include <linux/mm.h>
#include <net/tcp.h>
int (*ptr)(struct task_struct *task, char *buffer, int buflen);
%}
function dump(skk:long)
%{
struct sock *sk = (struct sock *)STAP_ARG_skk;
struct tcp_sock *tp = tcp_sk(sk);
struct inet_sock *inet = inet_sk(sk);
struct task_struct *curr = current;
char buf[128];
ptr = (void *)0xffffffffb6802d90;
if (ntohs(inet->inet_dport) == 80) {
ptr(curr, buf, 128);
STAP_PRINTF("%s %s %d\n", curr->comm, buf, curr->pid);
}
%}
probe kernel.function("tcp_connect")
{
dump($sk);
}
其中 0xffffffffb6802d90 这个地址是我在 /proc/kallsyms 里查到的。
上面的脚本完美打印出了全路径,我迫不及待得将这个发到群里,希望能够提供帮助。于是我复制粘贴了上面的脚本,一个 Enter 拍下去就发出了,后面我紧接着准备发送一句提示:
0xffffffffb6802d90这个地址你自己从/proc/kallsyms里找,就是get_cmdline的地址。cat /proc/kallsyms |grep get_cmdline 获取。
然而还没等我这句话发出,上面脚本已经被执行,机器已经panic了…这一切都怪 Enter 键。
换句话说,Enter 键作为发送快捷键让人们聊天的内容大部分都不再具有原子性。为了用 Enter 发送消息,有时候发送多段消息又怕不小心敲下 Enter 的时候,你不得不做类似的事情:
请注意,我下面的消息可能会分段发出,只有看到“发完了”的时候,才表示我发完了。。。或者就是如果我还没有发完,我就必须在每条消息后,Enter键拍下前加一句“我还没说完”。。。
而 Enter 键是很容易误碰的。对于程序员而言,除了空格之外的第二吧。
将 Enter 键作为默认的发送快捷键只能让消息发送更快更便捷,却很容易带来误解,有时候你话说一半就不小心发出去了。
这种问题在音视频通信中很常见,比如打电话,句子是一句一句断句的,你总不能每次都加一句我还没说完吧。所以一般重要场合,音频通话是要加锁的,比如一些军事行动,说话必须听到“完毕”才能整体理解,否则就接着听。
…
最后给一个有用的代码,获取绝对路径最简单的方法:
// curr 就是 current ,也就是一个task_struct
name = kstrdup_quotable_file(curr->mm->exe_file, GFP_KERNEL);
文章精选1、高手是如何写出让人看不懂的选择器?2、微信新功能:聊天可以加密了?真“悄悄话”3、我写代码的十八般兵器!4、微信提示:这些账户将迁移至 Wechat,开通后清爽无广告!5、嘘!你看到的所有地址都不是真的6、如果你也会手抖输错命令,那就必须给你推荐这个 Fuck 工具7、如何写出干净的 JavaScript 代码
8、火了!Game Boy 模拟器:完美运行超级马里奥、口袋妖怪等游戏!
8、火了!Game Boy 模拟器:完美运行超级马里奥、口袋妖怪等游戏!